package cn.monkey.transport.core;

import reactor.core.publisher.Mono;

public interface Outbound {

    /**
     * 关闭连接
     *
     * @return close result
     * 如果执行失败，则通过{@link Mono#error} 取获取错误信息
     */
    Mono<Void> close();

    /**
     * 写数据，但是可能并没有发送出去，需要调用flush方法已确保数据已发送
     *
     * @param data 数据
     * @return write result，
     * 如果执行失败，则通过{@link Mono#error} 取获取错误信息
     */
    Mono<Void> write(Object data);

    /**
     * 等于是同时调用write跟flush方法
     *
     * @param data 数据
     * @return writeAndFlush result
     * 如果执行失败，则通过{@link Mono#error} 取获取错误信息
     */
    Mono<Void> writeAndFlush(Object data);

    /**
     * 调用该方法确保数据已发送
     *
     * @return flush result
     * 如果执行失败，则通过{@link Mono#error} 取获取错误信息
     */
    Mono<Void> flush();
}
